package com.aasa.siappsap.action;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.*;

import org.apache.log4j.Logger;
import org.apache.struts.Globals;
import org.apache.struts.action.*;
import org.apache.struts.actions.*;

import com.aasa.siappsap.bean.*;
import com.aasa.siappsap.dao.*;
import com.aasa.siappsap.form.*;
import com.aasa.siappsap.logic.*;
import com.aasa.siappsap.util.*;
import com.lowagie.text.DocumentException;


public class GenerarReporteRFAAction extends DispatchAction {

	static private Logger objPv_logger = Logger.getLogger(GenerarReporteRFAAction.class);
	static private final int intPv_TIMEOUT = 200;
	
	//-----
	//--- Metodos para el listado de archivos
	//-----
	   
	public ActionForward iniciarReporte(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response){
		ActionMessages objL_messages = new ActionMessages();
		GenerarReporteRFAForm objL_form = (GenerarReporteRFAForm) form;
		ReporteBean objL_reporte = new ReporteBean();
		SimpleDateFormat objL_sdf = new SimpleDateFormat("dd/MM/yyyy");
		objL_reporte = (ReporteBean)request.getSession().getAttribute(Constants.strPb_PARAMETROS_BUSQUEDA);
		if(objL_reporte == null){
			objL_reporte = new ReporteBean();
			objL_reporte.setStrPv_idCentro("2100");
			objL_reporte.setStrPv_descCentro("");
				//Get current date, then convert String date to long
				
				java.util.Date objL_date = null;
				try {
					java.util.Date date = new java.util.Date();
					
					objL_date = objL_sdf.parse(objL_sdf.format(date));
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				java.sql.Date objL_fechaConsulta = new Date(objL_date.getTime());
				//end
			objL_reporte.setObjPv_Fecha(objL_fechaConsulta);
		}
		
		objL_form.setStrPv_idCentro(objL_reporte.getStrPv_idCentro());
		objL_form.setStrPv_descCentro(objL_reporte.getStrPv_descCentro());
		objL_form.setStrPv_Fecha(objL_sdf.format(objL_reporte.getObjPv_Fecha()).toString());
		
		try{
			
			cargarFormulario(objL_form);
			
		}catch (AccesoDaoException e) {
			
			// TODO Auto-generated catch block
			ActionMessage objL_ActionMessage = new ActionMessage("archivo.error.dao","Error al consultar parametros");
			objL_messages.add("incorrecto", objL_ActionMessage);
			saveErrors(request, objL_messages);
			request.setAttribute(Globals.ERROR_KEY, objL_messages);
			objPv_logger.error(objL_ActionMessage.toString(), e);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			ActionMessage objL_ActionMessage = new ActionMessage("archivo.error.dao","Error al consultar parametros");
			objL_messages.add("incorrecto", objL_ActionMessage);
			saveErrors(request, objL_messages);
			request.setAttribute(Globals.ERROR_KEY, objL_messages);
			objPv_logger.error(objL_ActionMessage.toString(), e);
		}
		saveErrors(request, objL_messages);
		return mapping.findForward("sucess");
	}
	
	public ActionForward buscarReporte(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws AccesoDaoException{
		
		String strL_usuario=(String)request.getRemoteUser();
		ActionMessages objL_messages = new ActionMessages();
		String strL_nomReporte = "";

		GenerarReporteRFAForm objL_form = (GenerarReporteRFAForm) form;
		ReporteBean objL_reporte = new ReporteBean();
		
		objL_reporte.setStrPv_idCentro(objL_form.getStrPv_idCentro());
		objL_reporte.setStrPv_descCentro(objL_form.getStrPv_descCentro());
		
		SimpleDateFormat objL_sdf = new SimpleDateFormat("dd/MM/yyyy");
		java.util.Date objL_date = null;
		try {
			objL_date = objL_sdf.parse(objL_form.getStrPv_Fecha());
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		java.sql.Date objL_fechaConsulta = new Date(objL_date.getTime());
		objL_reporte.setObjPv_Fecha(objL_fechaConsulta);

		
		request.getSession().setAttribute(Constants.strPb_PARAMETROS_BUSQUEDA, objL_reporte);
		GenerarReporteRFALogic objL_logic = new GenerarReporteRFALogic(); 
		
		try{
			cargarFormulario(objL_form);
			//Genera el reporte en PDF y en .txt
			strL_nomReporte = objL_logic.getIdGeneradoReporte(strL_usuario, objL_reporte.getStrPv_idCentro(), objL_reporte.getObjPv_Fecha());
			objL_logic.ejecProcReporte(objL_reporte.getStrPv_idCentro(), objL_sdf.format(objL_fechaConsulta), strL_usuario, strL_nomReporte);
			loadPDFReport(mapping,form,request,response,strL_nomReporte);
			loadTXTReport(mapping,form,request,response,strL_nomReporte);
		}catch (AccesoDaoException e) {
			// TODO Auto-generated catch block
			ActionMessage objL_ActionMessage = new ActionMessage("archivo.error.dao","Error al consultar parametros");
			objL_messages.add("incorrecto", objL_ActionMessage);
			saveErrors(request, objL_messages);
			request.setAttribute(Globals.ERROR_KEY, objL_messages);
			objPv_logger.error(objL_ActionMessage.toString(), e);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			ActionMessage objL_ActionMessage = new ActionMessage("archivo.error.dao","Error al consultar parametros");
			objL_messages.add("incorrecto", objL_ActionMessage);
			saveErrors(request, objL_messages);
			request.setAttribute(Globals.ERROR_KEY, objL_messages);
			objPv_logger.error(objL_ActionMessage.toString(), e);
		}
		
		saveErrors(request, objL_messages);		
		return null;
	}

	
	private void cargarFormulario(GenerarReporteRFAForm objA_form) throws AccesoDaoException {
		UtilArchivoLogic objL_logic = new UtilArchivoLogic();
		objA_form.setObjPv_centrosList(objL_logic.getCentrosList());
	}
	
	//-----
	//--- Metodos para el listado de busquedas diarias
	//-----
	
	public ActionForward loadPDFReport(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, String idReporte) throws AccesoDaoException, JRException {
		ActionMessages objL_messages = new ActionMessages();
		String strL_nombreArchivo=getServlet().getServletContext().getRealPath("/reportes/reporteRFA.jrxml");
		JasperReport objL_jasperReport = JasperCompileManager.compileReport(strL_nombreArchivo);
		GenerarReporteRFADao objL_dao = new GenerarReporteRFADao();
		String strL_usuario=(String)request.getRemoteUser();

		try{
			Map<String, Object> objL_parametros = new HashMap<String, Object>();
			objL_parametros.put("idReporte", idReporte);
			objL_parametros.put("idUsuario", strL_usuario);

			JasperPrint objL_jasperPrint = JasperFillManager.fillReport(objL_jasperReport, objL_parametros,objL_dao.getConnectionReporte());
			response.setContentType("application/x-file-download");
			response.setHeader("Content-disposition","attachment;filename="+idReporte+".pdf");
			response.setHeader("Cache-Control","max-age=" + intPv_TIMEOUT);
			ServletOutputStream objL_reporte = response.getOutputStream();
			JasperExportManager.exportReportToPdfStream(objL_jasperPrint, objL_reporte);
			
			objL_reporte.flush();
			objL_reporte.close();			
	    } catch (Exception e) {
			// TODO Auto-generated catch block
	    	e.printStackTrace();
			ActionMessage objL_ActionMessage = new ActionMessage("archivo.error.dao","Error al generar reporte");
			objL_messages.add("incorrecto", objL_ActionMessage);
			objPv_logger.error(objL_ActionMessage.toString(), e);
		}
	    saveErrors(request, objL_messages);
		return null;
	}
	
	public ActionForward loadTXTReport(ActionMapping mapping, ActionForm form, HttpServletRequest request,	HttpServletResponse response, String StrA_idReporte) throws AccesoDaoException, JRException {
		String strL_nombreArchivo = "";
		String strL_rutaArchivoTxt = "";
		String strL_usuario=(String)request.getRemoteUser();

		Properties objL_prop = new Properties(); 
	    try {
	        //load a properties file from class path
	    	objL_prop.load(GenerarReporteDao.class.getClassLoader().getResourceAsStream("path.properties"));
	        strL_rutaArchivoTxt=objL_prop.getProperty("txt.rfa.file.path");
	        } 
	    catch (IOException ex) {
	        ex.printStackTrace();
	    }
	    strL_nombreArchivo= StrA_idReporte + ".txt";
		GenerarReporteLogic objL_logic = new GenerarReporteLogic(); 
		StringBuffer strL_contenido= new StringBuffer();
		try {
			strL_contenido = objL_logic.obtenerContenidoReporte(strL_usuario, StrA_idReporte);
		} catch (DocumentException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		File objL_Archivo=new File(strL_rutaArchivoTxt+"\\"+strL_nombreArchivo);
		FileWriter objL_fileWriter=null;
		if(objL_Archivo.exists()){
			
			try {
				objL_fileWriter=new FileWriter(objL_Archivo,false);
				objL_fileWriter.write(strL_contenido.toString());
				objL_fileWriter.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		else{
			try {
				objL_Archivo.createNewFile();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
			try {
				objL_fileWriter=new FileWriter(objL_Archivo,false);
				objL_fileWriter.write(strL_contenido.toString());
				objL_fileWriter.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
	}
}
